如何解决错误? “服务器无法识别 HTTP 标头 SOAPAction 的值”

Posted

技术标签:

【中文标题】如何解决错误? “服务器无法识别 HTTP 标头 SOAPAction 的值”【英文标题】:How to solve the error? "Server did not recognize the value of HTTP Header SOAPAction" 【发布时间】:2021-10-17 06:38:40 【问题描述】:

我可以使用 Get Post 等网络服务。我可以在 localhost 上毫无问题地使用它。但是,当我尝试通过 android 应用程序使用它时,我遇到了这个错误。

我需要在网络服务端进行什么样的设置?因为我在java和android端做了很多事情,但是错误并没有消失。

错误消息:SoapFault - 故障代码:'soap:Client' 故障字符串:'System.Web.Services.Protocols.SoapException:服务器无法识别 HTTP 标头 SOAPAction 的值:https://api.example.com/LoginAPI。

public class YLogin extends AppCompatActivity 
 EditText yoneticieposta, yoneticiparola;
 Button yoneticiDGiris;
 String Eposta, Parola, ReturnResult;

 /*Web Service*/
 public static String URL="https://api.example.com/MCG-WS.asmx?WSDL";
 public static String NAMESPACE="https://api.example.com";

 /*Login API*/
 public static String SOAP_ACTION_LOGIN="https://api.example.com/LoginAPI";
 public static String METHOD_NAME_LOGIN="LoginAPI";

 @Override
 protected void onCreate(Bundle savedInstanceState) 
     super.onCreate(savedInstanceState);
     setContentView(R.layout.ylogin);

     TrustManager[] trustAllCerts = new TrustManager[]
             new X509TrustManager() 
                 public java.security.cert.X509Certificate[] getAcceptedIssuers() 
                     return null;
                 
                 public void checkClientTrusted(
                         java.security.cert.X509Certificate[] certs, String authType) 
                 
                 public void checkServerTrusted(
                         java.security.cert.X509Certificate[] certs, String authType) 
                 
             
     ;


     try 
         SSLContext sc = SSLContext.getInstance("SSL");
         sc.init(null, trustAllCerts, new java.security.SecureRandom());
         HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
      catch (Exception e) 
     


     try 
         java.net.URL url = new URL("https://api.example.com/MCG-WS.asmx");
      catch (MalformedURLException e) 
     

     yoneticieposta = (EditText) findViewById(R.id.yoneticiepostaTx);
     yoneticiparola = (EditText) findViewById(R.id.yoneticiparolaTx);
     yoneticiDGiris = (Button) findViewById(R.id.yoneticiDGirisYapBt);
     yoneticiDGiris.setOnClickListener(new View.OnClickListener() 
         @Override
         public void onClick(View v) 
             Eposta = yoneticieposta.getText().toString();
             Parola = yoneticiparola.getText().toString();

             if(Eposta.isEmpty() || Parola.isEmpty())
                 Toast.makeText(YLogin.this, "E-posta veya parola kısımlarını doldurun.", Toast.LENGTH_SHORT).show();
             else
                 new LoginAsyncTask().execute(Eposta, Parola);
             
         
     );
 

 private class LoginAsyncTask extends AsyncTask<String, Void, String> 
     @Override
     protected void onPreExecute() 
         super.onPreExecute();
     

     @Override
     protected String doInBackground(String... strings)

         SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME_LOGIN);

         PropertyInfo infoEposta = new PropertyInfo();
         infoEposta.setName("eposta");
         infoEposta.setType(String.class);
         infoEposta.setValue(strings[0].toString());
         request.addProperty(infoEposta);

         PropertyInfo infoParola = new PropertyInfo();
         infoParola.setName("parola");
         infoParola.setType(String.class);
         infoParola.setValue(strings[1].toString());
         request.addProperty(infoParola);

         SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

         envelope.dotNet =true;
         envelope.setOutputSoapObject(request);

         HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

         try 
             androidHttpTransport.call(SOAP_ACTION_LOGIN, envelope);

             SoapFault error = (SoapFault)envelope.bodyIn;
             System.out.println("TTTTTTTTTTTTTT Error message : "+error.toString());

             SoapObject result = (SoapObject)envelope.bodyIn;

             if(result!=null)
                 ReturnResult = result.getProperty(0).toString();
             

         
         catch(Exception e)
             e.printStackTrace();
             return e.toString();
         

         return ReturnResult;
     

     @Override
     protected void onPostExecute(String result) 

         if(result.equals("başarılı"))
             Intent intent = new Intent(YLogin.this, dashboard.class);
             intent.putExtra("yoneticiEposta", Eposta);
             startActivity(intent);
         else
             Toast.makeText(YLogin.this, "E-posta veya parolanız yanlış, tekrar deneyin.", Toast.LENGTH_SHORT).show();
         
     
 

【问题讨论】:

【参考方案1】:

我更新了代码的这些部分。问题解决了。

 /*Web Service*/
        public static String URL="https://api.example.com/MCG-WS.asmx?WSDL";
        public static String NAMESPACE="http://tempuri.org";
    
    
        /*Login API*/
        public static String SOAP_ACTION_LOGIN="http://tempuri.org/LoginAPI";
        public static String METHOD_NAME_LOGIN="LoginAPI";


if (envelope.bodyIn instanceof SoapFault) 
                    SoapFault error = (SoapFault) envelope.bodyIn;
                    System.out.println("TTTTTTTTTTTTTT Error message : " + error.toString());
                
                if (envelope.bodyIn instanceof SoapObject) 
                    SoapObject result = (SoapObject) envelope.bodyIn;
                    if(result!=null)
                        ReturnResult = result.getProperty(0).toString();
                    
                

【讨论】:

以上是关于如何解决错误? “服务器无法识别 HTTP 标头 SOAPAction 的值”的主要内容,如果未能解决你的问题,请参考以下文章

c#Ajax 的错误,应该如何解决?

"SQL SERVER,错误:207" 如何解决

如何解决“错误:输入中的语法错误(1)。”

如何解决此分段错误:以下代码的 11 错误?

如何解决子重复错误?

Ftp 错误代码 550,如何解决