java - 为什么我使用 java post-request 来响应状态代码 500 的内部服务器错误?

标签 java python http request bounding-box

嘿,我是 StackOverFlow 的新人

实际上我正在尝试从官方数据库( https://emf2.bundesnetzagentur.de/karte/Default.aspx )获取数据。 我使用java并尝试通过带有参数的post请求获取信息。 我编写了两个不同的版本,一种使用 Apache httpclient,另一种使用 java.net。 我还有一个用 Python 编写的版本(不是我的)

java中的不行!我至少收到此错误作为响应:

Statuscode: 500 Internal Server Error
{"d":{"Message":"Fehler bei der Suche nach Funkanlagenstandorten.","StackTrace":"","Source":"","InnerException":""}}


System.InvalidOperationException: 'GetStandorteFreigabe' ist kein gültiger Webdienst-Methodenname. bei System.Web.Services.Protocols.HttpServerProtocol.Initialize() bei System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CookieStore;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.HttpClientBuilder;
import org.json.simple.JSONObject;

import objects.BoundingBox;
import objects.Header;

public class HttpClientTest
{
    // TODO Größe der Bounding Box?
    public static void main(String[] args)
    {
       try
       {
          new HttpClientTest();
       }
       catch (IOException e)
       {
          e.printStackTrace();
       }
    }

    Header header;

    @SuppressWarnings("unchecked")
    public HttpClientTest() throws ClientProtocolException, IOException
    {
       List<BoundingBox> boxes = getBboxes();
       for (BoundingBox bBox : boxes)
       {
          HttpClient client = null;
          CookieStore cookieStore = new BasicCookieStore();
          HttpClientBuilder builder = HttpClientBuilder.create().setDefaultCookieStore(cookieStore);
          client = builder.build();

          String cookie = getCookie();
          HttpPost postRequest = new HttpPost(
                "https://" + Start.EMF + ".bundesnetzagentur.de/karte/Standortservice.asmx/GetStandorteFreigabe");
          header = new Header().getDefaultHeader();
          header.add("Cookie", cookie);
          Set<String> entries = header.keySet();
          for (String key : entries)
             postRequest.addHeader(key, header.get(key));

          // Request parameters and other properties.
          JSONObject obj = new JSONObject();
          JSONObject subObj = new JSONObject();
          subObj.put("sued", bBox.getSouth());
          subObj.put("west", bBox.getWest());
          subObj.put("nord", bBox.getNorth());
          subObj.put("ost", bBox.getEast());
          obj.put("Box", subObj);
          System.out.println("RequestJSON: " + obj.toJSONString());

          StringEntity requestEntity = new StringEntity(obj.toJSONString());
          requestEntity.setContentEncoding("UTF-8");
          requestEntity.setContentType("application/json");
          postRequest.setEntity(requestEntity);

          // Execute and get the response.
          HttpResponse response = client.execute(postRequest);
          System.out.println(response.getStatusLine());
          System.out.println(Arrays.deepToString(response.getAllHeaders()));

          HttpEntity entity = response.getEntity();
          if (entity != null)
          {
             StringBuilder sb = new StringBuilder();
             try (InputStream instream = entity.getContent())
             {
                BufferedReader reader = new BufferedReader(new InputStreamReader(instream));
                for (String line; (line = reader.readLine()) != null;)
                {
                    sb.append(line + "\r\n");
                }

                reader.close();
                // do something useful
             }
             System.out.println(sb.toString());
          }
       }

    }

    private String getCookie()
    {
       StringBuilder cookieStringBuilder = new StringBuilder();
       try
       {
          HttpClient client = null;
          CookieStore cookieStore = new BasicCookieStore();
          HttpClientBuilder builder = HttpClientBuilder.create().setDefaultCookieStore(cookieStore);
          client = builder.build();
          HttpGet httpGet = new HttpGet("https://" + Start.EMF + ".bundesnetzagentur.de/karte/Default.aspx");
          client.execute(httpGet);
          cookieStore.getCookies().forEach(e ->
             {
                cookieStringBuilder.append(e.getName() + " = " + e.getValue());
                cookieStringBuilder.append(";");
             });

       }
       catch (IOException e1)
       {
          e1.printStackTrace();
       }

       System.out.println("Cookie: " + cookieStringBuilder.toString());
       return cookieStringBuilder.toString();
    }

    private List<BoundingBox> getBboxes()
    {
//     BoundingBox box = new BoundingBox();
       BoundingBox box = new BoundingBox(13.679351806640627, 51.06313741319562, 13.723812103271484,
             51.082174834773625);
       List<BoundingBox> bBoxes = new ArrayList<>();
       bBoxes.add(box);
//     double south, west, north, east;
//     south = box.getSouth();
//
//     while (south <= box.getNorth())
//     {
//        north = south + JavaDefaultTest.STEP;
//        west = box.getWest();
//        while (west <= box.getEast())
//        {
//           east = west + JavaDefaultTest.STEP;
//           bBoxes.add(new BoundingBox(west, south, east, north));
//           west += JavaDefaultTest.STEP;
//        }
//        south += JavaDefaultTest.STEP;
//     }
       return bBoxes;
    }
}

边界框:

package objects;

import java.util.ArrayList;
import java.util.List;

/**
 * order: west, south, east, north
 * 
 * @author Zinke
 *
 */
public class BoundingBox
{
    public final static double STEP = 0.03d;
    private double north;
    private double east;
    private double west;
    private double south;

    private static final double northMin = 47.0f, northMax = 55.0f;
    private static final double eastMin = 5.0f, eastMax = 16.0f;

    /**
     * <b>Initial constructor</b><br>
     * <br>
     * Bounding box for data scraping: Germany<br>
     * coordiantes in decimal degree<br>
     * <br>
     * order: west, south, east, north
     */
    public BoundingBox()
    {
       setWest(eastMin);
       setSouth(northMin);
       setEast(eastMin + STEP);
       setNorth(northMin + STEP);
    }

    /**
     * Bounding box for data scraping: Germany<br>
     * coordiantes in decimal degree<br>
     * order: west, south, east, north
     * 
     * @param west
     * @param south
     * @param east
     * @param north
     */
    public BoundingBox(double north, double east,double south,double west)
    {
       setWest(west);
       setNorth(north);
       setEast(east);
       setSouth(south);
    }

    public double getNorth()
    {
       return north;
    }

    public void setNorth(double north)
    {
       this.north = north;
    }

    public double getEast()
    {
       return east;
    }

    public void setEast(double east)
    {
       this.east = east;
    }

    public double getWest()
    {
       return west;
    }

    public void setWest(double west)
    {
       this.west = west;
    }

    public double getSouth()
    {
       return south;
    }

    public void setSouth(double south)
    {
       this.south = south;
    }

    /**
     * Returns a list with bounding boxes for whole germany <br>
     * From Southest+Westest Point beginning
     * 
     * @return
     */
    public static List<BoundingBox> getAllBboxes()
    {
       BoundingBox box = new BoundingBox();
       List<BoundingBox> bBoxes = new ArrayList<>();
       bBoxes.add(box);// set Starting Box

       double south, west, north, east;
       south = box.getSouth();
       while (south <= northMax)
       {
          north = south + BoundingBox.STEP;
          west = box.getWest();
          while (west <= eastMax)
          {
             east = west + BoundingBox.STEP;
             bBoxes.add(new BoundingBox(north,east,south,west));
             west += BoundingBox.STEP;
          }
          south += BoundingBox.STEP;
       }
       return bBoxes;
    }
}

有人可以帮我吗?

最佳答案

你的代码似乎可以工作。我刚刚尝试过,仅更改了示例中提供的坐标值,并从我的浏览器调试控制台中提取了一些坐标值,并且它有效:

{"nord":51.7151177895987,"ost":12.70294189453125,"sued":9.857482910156252,"west":50.49770501038011}

我的猜测是,您应该确保您的 BoundingBox 类中没有错误,并且每个坐标值的范围是合适的。

关于java - 为什么我使用 java post-request 来响应状态代码 500 的内部服务器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58373814/

相关文章:

python - 如何在 python 中迭代多个数据帧以选择每个数据帧中的一列?

python - Numpy 切片多维错误产生意外结果

python - 在 firebase 中定期运行一个 python 程序作为后台服务

web-services - 如何使用名称/值对创建 HTTP POST 的 Mule ESB 服务?

坏数据的 HTTP 状态代码

android - Spring Boot 上的 Controller 415 不支持的媒体类型

java - 使用iText java将字体设置为pdf中的段落

java : mapping the Values from Enumeration to Object

java - 在 Java 中检测没有文本框的击键

java - 坚持使用 lambda 表达式和 Map